package com.xyzh.application.common.util;




import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Value;

import java.io.*;


/**
 * @author JZB
 * @date 2023/6/23 14:40
 */
public class FileUtil {



    @Value("${Application.filepath}")
    public  String fileUrl = "/home/appl/file";


    private static FileUtil fileUtil;

    public static FileUtil Instance(){
        if(ObjectUtil.isEmpty(fileUtil)){
            return new FileUtil();
        }else{
            return fileUtil;
        }
    }

    /**
     * 删除单个文件
     *
     * @param sPath 被删除文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public  boolean deleteFile(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

    /**
     * 删除目录（文件夹）以及目录下的文件
     *
     * @param sPath 被删除目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    public  boolean deleteDirectory(String sPath) {
        // 如果sPath不以文件分隔符结尾，自动添加文件分隔符
        if (!sPath.endsWith(File.separator)) {
            sPath = sPath + File.separator;
        }
        File dirFile = new File(sPath);
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        boolean flag = true;
        // 删除文件夹下的所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) {
                    break;
                }
            } // 删除子目录
            else {
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag) {
                    break;
                }
                File dirsFile=new File(files[i].getAbsolutePath());
                dirsFile.delete();
            }

        }
        if (!flag) {
            return false;
        }
        return true;
        // 删除当前目录
//        if (dirFile.delete()) {
//            return true;
//        } else {
//            return false;
//        }
    }

    /**
     * 复制文件
     *
     * @param src
     * @param dst
     */
    public  void copy(File src, File dst) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(src);
            out = new FileOutputStream(dst);

            // Transfer bytes from in to out
            byte[] buf = new byte[1024];
            int len = -1;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }
        return;
    }


    /**
     * 读取文件大小
     *
     * @param filename 指定文件路径
     * @return 文件大小
     */
    public  int getFileSize(String filename) {
        try {
            File fl = new File(filename);
            int length = (int) fl.length();
            return length;
        } catch (Exception e) {
            return 0;
        }

    }

    public String getFilePath(String dirPath,String extension){
        File folder = new File(dirPath);//文件夹路径
        File[] listOfFiles = folder.listFiles();
        String path="";
        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].isFile()) {
                String  fileName=listOfFiles[i].toString();
                if(extension.equals(fileName.substring(fileName.lastIndexOf(".")+1))){
                    path= listOfFiles[i].toString();
                    break;

                }
            } else if (listOfFiles[i].isDirectory() && StrUtil.isEmpty(path)) {
                path=   getFilePath(listOfFiles[i].getPath(),extension);
            }
        }
        return path;
    }
}
